#include<iostream>
using namespace std;

void swap_comm(int x,int y)
{
    int temp = x;
    x = y;
    y = temp;
}
void swap(int *x,int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
void swap(int &x,int &y)
{
    int temp = x;
    x = y;
    y = temp;
}

int main()
{
    int array[10] = {};
    int *a_p1 = array;// 指针指向数组的首地址
    int (&a_inf)[10] = array;//定义一个引用变量来存储array，也就是别名
    cout << sizeof(array) << "," << sizeof(a_p1) << "," << sizeof(a_inf) << endl; // 40,8,40

    int i = 10; // i是一个左值，有内存，有名字，值可以修改
    int &j = i; // j左值引用变量

    // int m = &20; 20是一个右值，没内存，没名字
    int &&m = 20;// 可以使用右值引用
    m = 30;
    // int &&n = m; n是一个右值引用变量，但是它本身是一个左值
    int &n = m;

    const int &k = 20; // int temp=20;const int &k=temp;这个代码的编译过程和int &&m=20;一样，不过m可以被修改而k不能被修改
    // k = 30; k是常量，不能被修改

    int a = 0;
    int b = 10;
    int &c = a;
    // int &d; 引用必须要初始化
    int *d = &b;
    int *e;                                    // 指针可以不初始化
    c = 20;                                    // c就相当于a的别名，
    cout << a << "," << b << "," << c << endl; // 20，10, 20
    *d = 30;
    cout << a << "," << b << "," << *d << endl; // 20，30, 30

    cout << a << "," << b << endl; //0，10
    swap_comm(a, b);//传值，没啥用，会新建临时变量，更改的只是临时变量的值，不会更改a，b的值
    cout << a << "," << b << endl; // 0，10
    swap(a, b);//传引用
    cout << a << "," << b << endl; // 10，0
    swap(&a, &b);//传指针
    cout << a << "," << b << endl; // 0，10

    

    return 0;
}